/**
 * @file STL_Json.h
 * @author Derek Liu (yjkhtddx@sina.com)
 * @brief 
 * @version 0.1
 * @date 2020-09-10
 * 
 * @copyright Copyright Sci-Tech Laboratories (c) 2020
 * 
 */

#ifndef __STL_Json_H__
#define __STL_Json_H__

#include "json/json.h"
#define JSONCPP Json // MYJson(使用最新jsoncpp库,如果使用旧项目的中的jsoncpp库,请修改域名)
#include <string>

namespace STL
{
    /**
     * @brief 输出JSON
     * 
     * @param value 
     * @param table 
     */
    void printfJson(JSONCPP::Value value, std::string table = "Json");
    /**
     * @brief Get the Fast String object
     * 
     * @param value 
     * @return std::string 
     */
    std::string getFastString(JSONCPP::Value value);
    /**
     * @brief Get the Styled String object
     * @deprecated 使用JSONCPP::Value::toStyledString()
     * @param value 
     * @return std::string 
     */
    std::string getStyledString(JSONCPP::Value value);
    /**
     * @brief Get the Json From String object
     * 
     * @param str 
     * @return JSONCPP::Value 
     */
    JSONCPP::Value getJsonFromString(std::string str);
    /**
     * @brief 合并Object
     * 出现重复键值,前者为主
     * 
     * @param value1 
     * @param value2 
     * @return JSONCPP::Value 
     */
    JSONCPP::Value unionJsonObject(JSONCPP::Value object1, JSONCPP::Value object2);
    /**
     * @brief 合并Array
     * 
     * @param value1 
     * @param value2 
     * @return JSONCPP::Value 
     */
    JSONCPP::Value unionJsonArray(JSONCPP::Value array1, JSONCPP::Value array2);
    /**
     * @brief 截取数组
     * 
     * @param array 
     * @param start 
     * @param len 
     * @return JSONCPP::Value 
     */
    JSONCPP::Value sliceArray(JSONCPP::Value array, int pos,int len);
    /**
     * @brief 检测是否缺少对象类型子节点
     * 
     * @param request 
     * @param key 
     * @return true 缺失
     * @return false 未缺失
     */
    bool checkIsMissObject(JSONCPP::Value &object, std::string key);
    /**
     * @brief 检测是否缺少数组类型子节点
     * 
     * @param request 
     * @param key 
     * @return true 缺失
     * @return false 未缺失
     */
    bool checkIsMissArray(JSONCPP::Value &object, std::string key);
    /**
     * @brief 检测是否缺少字符串类型子节点
     * 
     * @param request 
     * @param key 
     * @return true 缺失
     * @return false 未缺失
     */
    bool checkIsMissString(JSONCPP::Value &object, std::string key);
    /**
     * @brief 检测是否缺少数字类型子节点
     * 
     * @param request 
     * @param key 
     * @return true 缺失
     * @return false 未缺失
     */
    bool checkIsMissNumber(JSONCPP::Value &object, std::string key);
    bool checkIsMissInt(JSONCPP::Value &object, std::string key);
    /**
     * @brief 检测是否缺少布尔类型子节点
     * 
     * @param request 
     * @param key 
     * @return true 缺失
     * @return false 未缺失
     */
    bool checkIsMissBool(JSONCPP::Value &object, std::string key);
    /**
     * @brief 清理对象中的空值
     * 
     * @param object 
     * @return JSONCPP::Value 
     */
    JSONCPP::Value clearNullOfObject(JSONCPP::Value &object);
} // namespace STL

#endif /* __STL_Json_H__ */